/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aluno;

import endereco.Endereco;
import entities.annotations.PropertyDescriptor;
import entities.annotations.View;
import entities.annotations.Views;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;

/**
 *
 * @author pedro
 */

@Entity
@Views({
    @View(
        name="Aluno",
        title="Cadastro de Aluno",
        members = "[nomeCompleto;dataDeNascimento;*dataDaMatricula;valorMensalidade;"
        + "Endereço[endereco.rua;"
        + "endereco.numero;"
        + "endereco.bairro;"
        + "endereco.cidade]]",
        template = "@CRUD"
        )
})

public class Aluno implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long matricula;
    
    @Column(name = "nome_completo")
    @PropertyDescriptor(displayName = "Nome completo", displayWidth = 50)
    @NotEmpty(message = "Informe o nome do aluno")
    private String nomeCompleto;
    
    @Column(name = "data_de_nascimento")
    @Temporal(javax.persistence.TemporalType.DATE)
    @PropertyDescriptor(displayName = "Data de nascimento")
    @NotNull(message = "Informe a data de nascimento")
    private Date dataDeNascimento;
    
    @Embedded
    private Endereco endereco = new Endereco();

    @Column(name = "valor_mensalidade")
    @PropertyDescriptor(displayName = "Valor da mensalidade")
    @NotNull(message = "Informe o valor da mensalidade")
    private float valorMensalidade;
    
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataDaMatricula = new Date();
    
    public Endereco getEndereco() {
       return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public long getMatricula() {
        return matricula;
    }

    public void setMatricula(long matricula) {
        this.matricula = matricula;
    }
    
    public String getNomeCompleto() {
        return nomeCompleto;
    }

    public void setNomeCompleto(String nomeCompleto) {
        this.nomeCompleto = nomeCompleto;
    }

    public Date getDataDeNascimento() {
        return dataDeNascimento;
    }

    public void setDataDeNascimento(Date dataDeNascimento) {
        this.dataDeNascimento = dataDeNascimento;
    }

    public float getValorMensalidade() {
        return valorMensalidade;
    }

    public void setValorMensalidade(float valorMensalidade) {
        this.valorMensalidade = valorMensalidade;
    }

    public Date getDataDaMatricula() {
        return dataDaMatricula;
    }

    public void setDataDaMatricula(Date dataDaMatricula) {
        this.dataDaMatricula = dataDaMatricula;
    }

    @Override
    public String toString() {
        return "Matricula : " + matricula;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 53 * hash + (int) (this.matricula ^ (this.matricula >>> 32));
        hash = 53 * hash + (this.nomeCompleto != null ? this.nomeCompleto.hashCode() : 0);
        hash = 53 * hash + (this.dataDeNascimento != null ? this.dataDeNascimento.hashCode() : 0);
        hash = 53 * hash + Float.floatToIntBits(this.valorMensalidade);
        hash = 53 * hash + (this.dataDaMatricula != null ? this.dataDaMatricula.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Aluno other = (Aluno) obj;
        if (this.matricula != other.matricula) {
            return false;
        }
        if ((this.nomeCompleto == null) ? (other.nomeCompleto != null) : !this.nomeCompleto.equals(other.nomeCompleto)) {
            return false;
        }
        if (this.dataDeNascimento != other.dataDeNascimento && (this.dataDeNascimento == null || !this.dataDeNascimento.equals(other.dataDeNascimento))) {
            return false;
        }
        if (Float.floatToIntBits(this.valorMensalidade) != Float.floatToIntBits(other.valorMensalidade)) {
            return false;
        }
        if (this.dataDaMatricula != other.dataDaMatricula && (this.dataDaMatricula == null || !this.dataDaMatricula.equals(other.dataDaMatricula))) {
            return false;
        }
        return true;
    }

    
}
